/**
 * 人脸识别相关工具函数
 */

/**
 * 将base64图片数据转换为临时文件路径
 * @param {string} base64Data - base64图片数据
 * @param {string} fileName - 文件名（可选）
 * @returns {Promise<string>} 临时文件路径
 */
export const base64ToTempFile = async (base64Data, fileName = 'face_image.jpg') => {
  try {
    // 移除base64前缀
    const base64 = base64Data.replace(/^data:image\/[a-z]+;base64,/, '')
    
    // 在H5环境下，直接返回base64数据URL
    // #ifdef H5
    return base64Data
    // #endif
    
    // 在App环境下，将base64保存为临时文件
    // #ifndef H5
    const fs = uni.getFileSystemManager()
    const tempFilePath = `${uni.env.USER_DATA_PATH}/${fileName}`
    
    return new Promise((resolve, reject) => {
      fs.writeFile({
        filePath: tempFilePath,
        data: base64,
        encoding: 'base64',
        success: () => {
          console.log('base64图片保存成功:', tempFilePath)
          resolve(tempFilePath)
        },
        fail: (error) => {
          console.error('base64图片保存失败:', error)
          reject(error)
        }
      })
    })
    // #endif
    
  } catch (error) {
    console.error('base64转文件失败:', error)
    throw error
  }
}

/**
 * 验证人脸图片数据
 * @param {string} imageData - 图片数据（base64或文件路径）
 * @returns {boolean} 是否有效
 */
export const validateFaceImage = (imageData) => {
  if (!imageData || typeof imageData !== 'string') {
    return false
  }
  
  // 检查是否是base64格式
  if (imageData.startsWith(', '')
    
    // 计算文件大小（base64编码后的大小约为原文件的4/3）
    const sizeInBytes = (base64.length * 3) / 4
    const sizeInKB = Math.round(sizeInBytes / 1024)
    
    return sizeInKB
  } catch (error) {
    console.error('计算图片大小失败:', error)
    return 0
  }
}

/**
 * 压缩base64图片
 * @param {string} base64Data - 原始base64数据
 * @param {number} quality - 压缩质量（0-1）
 * @param {number} maxWidth - 最大宽度
 * @param {number} maxHeight - 最大高度
 * @returns {Promise<string>} 压缩后的base64数据
 */
export const compressImage = (base64Data, quality = 0.8, maxWidth = 800, maxHeight = 600) => {
  return new Promise((resolve, reject) => {
    try {
      // #ifdef H5
      const canvas = document.createElement('canvas')
      const ctx = canvas.getContext('2d')
      const img = new Image()
      
      img.onload = () => {
        // 计算压缩后的尺寸
        let { width, height } = img
        
        if (width > maxWidth || height > maxHeight) {
          const ratio = Math.min(maxWidth / width, maxHeight / height)
          width = Math.round(width * ratio)
          height = Math.round(height * ratio)
        }
        
        // 设置canvas尺寸并绘制图片
        canvas.width = width
        canvas.height = height
        ctx.drawImage(img, 0, 0, width, height)
        
        // 转换为压缩后的base64
        const compressedBase64 = canvas.toDataURL('image/jpeg', quality)
        resolve(compressedBase64)
      }
      
      img.onerror = () => {
        reject(new Error('图片加载失败'))
      }
      
      img.src = base64Data
      // #endif
      
      // #ifndef H5
      // 在非H5环境下，直接返回原图片（或使用其他压缩方法）
      resolve(base64Data)
      // #endif
      
    } catch (error) {
      reject(error)
    }
  })
}

/**
 * 格式化人脸识别错误信息
 * @param {Error|string} error - 错误对象或错误信息
 * @returns {string} 格式化后的错误信息
 */
export const formatFaceError = (error) => {
  if (typeof error === 'string') {
    return error
  }
  
  if (error && error.message) {
    // 处理常见的错误类型
    if (error.message.includes('camera')) {
      return '摄像头访问失败，请检查权限设置'
    }
    
    if (error.message.includes('network') || error.message.includes('timeout')) {
      return '网络连接失败，请检查网络设置'
    }
    
    if (error.message.includes('face')) {
      return '人脸识别失败，请确保光线充足且正对摄像头'
    }
    
    return error.message
  }
  
  return '未知错误，请重试'
}

/**
 * 生成人脸图片文件名
 * @param {string} username - 用户名
 * @param {string} type - 类型（register/login）
 * @returns {string} 文件名
 */
export const generateFaceFileName = (username, type = 'face') => {
  const timestamp = Date.now()
  const randomStr = Math.random().toString(36).substring(2, 8)
  return `${type}_${username}_${timestamp}_${randomStr}.jpg`
}

export default {
  base64ToTempFile,
  validateFaceImage,
  getImageSize,
  compressImage,
  formatFaceError,
  generateFaceFileName
}
